{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "is_executing": true
    },
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:27.756186546Z",
     "start_time": "2023-05-31T13:10:27.090972565Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import pywt\n",
    "import mne\n",
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [],
   "source": [
    "WAVELETNAME = 'morl'\n",
    "edf_dir = r\"Jean-Pol_repaired_headers\"\n",
    "from MyEDFImports import import_ecg, get_edf_filenames\n",
    "\n",
    "edfs_names = get_edf_filenames()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:27.760135575Z",
     "start_time": "2023-05-31T13:10:27.756787878Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [],
   "source": [
    "#Here I want to get stages and the date that the stages took place in\n",
    "def date_from_comment(file):\n",
    "    with open(file) as f:\n",
    "        for line in f:\n",
    "            if line.startswith(\"% night =\"):\n",
    "                return line[-11:-1]\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:27.778754362Z",
     "start_time": "2023-05-31T13:10:27.762737308Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Getting stages from one file with dates"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_5280/2837210468.py:2: UserWarning: Parsing dates in DD/MM/YYYY format when dayfirst=False (the default) was specified. This may lead to inconsistently parsed dates! Specify a format to ensure consistent parsing.\n",
      "  record_day = pd.to_datetime(date_from_comment(name))\n"
     ]
    },
    {
     "data": {
      "text/plain": "                     Time  stage\nIndex                           \n0     2005-11-29 21:35:12      0\n1     2005-11-29 21:35:32      0\n2     2005-11-29 21:35:52      0\n3     2005-11-29 21:36:12      0\n4     2005-11-29 21:36:32      0\n...                   ...    ...\n2002  2005-11-29 08:42:32      0\n2003  2005-11-29 08:42:52      0\n2004  2005-11-29 08:43:12      0\n2005  2005-11-29 08:43:32      0\n2006  2005-11-29 08:43:52      0\n\n[2007 rows x 2 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Time</th>\n      <th>stage</th>\n    </tr>\n    <tr>\n      <th>Index</th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>2005-11-29 21:35:12</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2005-11-29 21:35:32</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2005-11-29 21:35:52</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2005-11-29 21:36:12</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2005-11-29 21:36:32</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>2002</th>\n      <td>2005-11-29 08:42:32</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2003</th>\n      <td>2005-11-29 08:42:52</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2004</th>\n      <td>2005-11-29 08:43:12</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2005</th>\n      <td>2005-11-29 08:43:32</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2006</th>\n      <td>2005-11-29 08:43:52</td>\n      <td>0</td>\n    </tr>\n  </tbody>\n</table>\n<p>2007 rows × 2 columns</p>\n</div>"
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "name = edf_dir +'//'+ edfs_names[0] + '_stages.txt'\n",
    "record_day = pd.to_datetime(date_from_comment(name))\n",
    "begining_of_time = pd.to_datetime('1900-01-01')\n",
    "day_shift = record_day - begining_of_time\n",
    "stages = pd.read_csv(name, comment='%', delimiter='\t', index_col=0).drop('Unnamed: 3', axis=1)\n",
    "stages['Time'] = pd.to_datetime(stages['Time'], format='%H:%M:%S') + day_shift\n",
    "stages.index = stages.index -1\n",
    "stages"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:27.803357999Z",
     "start_time": "2023-05-31T13:10:27.779118659Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Getting counted stages from all files without dates"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [],
   "source": [
    "import os\n",
    "all_files = os.listdir(edf_dir)\n",
    "big_edf_files = list(filter(lambda x: 'EDF' in x, all_files))\n",
    "newnames = []\n",
    "for name in big_edf_files:\n",
    "    ind = name.index('EDF')\n",
    "\n",
    "    newname = name[:ind] + 'edf' + name[ind+3:]\n",
    "    newnames.append(newname)\n",
    "for (x,y) in (zip(big_edf_files, newnames)):\n",
    "    print('changing name of {x}')\n",
    "    os.rename(edf_dir + '//' + x,edf_dir + '//' + y)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:27.803879380Z",
     "start_time": "2023-05-31T13:10:27.793448748Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [],
   "source": [
    "os.rename(*('rere.txt','requirements.txt'))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:27.854217327Z",
     "start_time": "2023-05-31T13:10:27.796838987Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Jean-Pol_repaired_headers//CP229110.edf_stages.txt\n",
      "Jean-Pol_repaired_headers//WD224010.edf_stages.txt\n",
      "Jean-Pol_repaired_headers//TK221110.edf_stages.txt\n",
      "Jean-Pol_repaired_headers//VP214110.edf_stages.txt\n",
      "Jean-Pol_repaired_headers//CN223100.edf_stages.txt\n",
      "Jean-Pol_repaired_headers//LM230010.edf_stages.txt\n",
      "Jean-Pol_repaired_headers//VC209100.edf_stages.txt\n",
      "Jean-Pol_repaired_headers//LA216100.edf_stages.txt\n",
      "Jean-Pol_repaired_headers//DG220020.edf_stages.txt\n",
      "Jean-Pol_repaired_headers//DO223050.edf_stages.txt\n",
      "Jean-Pol_repaired_headers//CX230050.edf_stages.txt\n"
     ]
    }
   ],
   "source": [
    "# cleaning from \"_wake\" and such\n",
    "edfs_names = [name for name in edfs_names if '_' not in name]\n",
    "all_stages = []\n",
    "for name in edfs_names:\n",
    "    fname = edf_dir +'//'+ name + '_stages.txt'\n",
    "    print(fname)\n",
    "    stages = pd.read_csv(fname, comment='%', delimiter='\t', index_col=0).drop('Unnamed: 3', axis=1)\n",
    "    raw_stages = np.copy(stages['stage'])\n",
    "    all_stages.extend(raw_stages)\n",
    "from collections import Counter\n",
    "counted = Counter(all_stages)\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:27.862380431Z",
     "start_time": "2023-05-31T13:10:27.839069700Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "data": {
      "text/plain": "[<matplotlib.lines.Line2D at 0x7f287cadfa90>]"
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "sorted_keys = sorted(dict(counted).keys())\n",
    "counted = {k:counted[k] for k in sorted_keys}\n",
    "plt.plot(counted.keys(), counted.values())"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:27.992915888Z",
     "start_time": "2023-05-31T13:10:27.839443437Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "data": {
      "text/plain": "{0: 3519, 1: 1127, 2: 8844, 3: 975, 4: 1310, 5: 3473}"
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "counted"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:28.118454776Z",
     "start_time": "2023-05-31T13:10:27.973957136Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "data": {
      "text/plain": "3519"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dict(counted)[0]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:28.119204341Z",
     "start_time": "2023-05-31T13:10:28.019498085Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting EDF parameters from /home/tadeusz/Desktop/Tadeusz/mgr_sleep_states/Jean-Pol_repaired_headers/CP229110.edf...\n",
      "EDF file detected\n",
      "Setting channel info structure...\n",
      "Creating raw.info structure...\n",
      "NOTE: pick_channels() is a legacy function. New code should use inst.pick(...).\n",
      "Extracting EDF parameters from /home/tadeusz/Desktop/Tadeusz/mgr_sleep_states/Jean-Pol_repaired_headers/WD224010.edf...\n",
      "EDF file detected\n",
      "Setting channel info structure...\n",
      "Creating raw.info structure...\n",
      "NOTE: pick_channels() is a legacy function. New code should use inst.pick(...).\n",
      "Extracting EDF parameters from /home/tadeusz/Desktop/Tadeusz/mgr_sleep_states/Jean-Pol_repaired_headers/TK221110.edf...\n",
      "EDF file detected\n",
      "Setting channel info structure...\n",
      "Creating raw.info structure...\n",
      "NOTE: pick_channels() is a legacy function. New code should use inst.pick(...).\n",
      "Extracting EDF parameters from /home/tadeusz/Desktop/Tadeusz/mgr_sleep_states/Jean-Pol_repaired_headers/VP214110.edf...\n",
      "EDF file detected\n",
      "Setting channel info structure...\n",
      "Creating raw.info structure...\n",
      "NOTE: pick_channels() is a legacy function. New code should use inst.pick(...).\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/tadeusz/Desktop/Tadeusz/mgr_sleep_states/MyEDFImports.py:19: RuntimeWarning: Channel names are not unique, found duplicates for: {'CHIN EMG'}. Applying running numbers for duplicates.\n",
      "  raw = mne.io.read_raw_edf(path + \"//\" + name)\n",
      "/home/tadeusz/Desktop/Tadeusz/mgr_sleep_states/MyEDFImports.py:19: RuntimeWarning: Channel names are not unique, found duplicates for: {'CHIN EMG'}. Applying running numbers for duplicates.\n",
      "  raw = mne.io.read_raw_edf(path + \"//\" + name)\n"
     ]
    }
   ],
   "source": [
    "edfs = [import_ecg(edf) for edf in edfs_names[:4]]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T13:10:28.187423560Z",
     "start_time": "2023-05-31T13:10:28.020083257Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Getting all data split into 20sec intervals"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [],
   "source": [
    "# name = edf_dir +'//'+ edfs_names[0] + '_stages.txt'\n",
    "for edf in edfs:\n",
    "    sampl_freq = edf.info[\"sfreq\"]\n",
    "    nr_windows = int(len(edf[0][1]) // sampl_freq // 20)\n",
    "    windows = []\n",
    "    for i in range(nr_windows):\n",
    "        windows.append(edf.time_as_index([20*i,20*(i+1)]))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T14:24:06.626287454Z",
     "start_time": "2023-05-31T13:10:28.179035570Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2005-11-29 21:35:12+00:00\n"
     ]
    }
   ],
   "source": [
    "for edf in edfs[:1]:\n",
    "    print(edf.info['meas_date'])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T14:24:06.627389538Z",
     "start_time": "2023-05-31T13:14:55.882948920Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CWT nr : 0\n",
      "CWT nr : 300\n",
      "CWT nr : 600\n",
      "CWT nr : 900\n",
      "CWT nr : 1200\n",
      "CWT nr : 1500\n",
      "CWT nr : 1800\n"
     ]
    }
   ],
   "source": [
    "import pywt\n",
    "raw = edfs[0]\n",
    "sampl_freq = raw.info[\"sfreq\"]\n",
    "windows = int(len(raw[0][1]) // sampl_freq // 20)\n",
    "atributes, frequencies = [], []\n",
    "for i in range(windows):\n",
    "\n",
    "    start_stop_ind = raw.time_as_index([20*i,20*(i+1)])\n",
    "    start = start_stop_ind[0]\n",
    "    stop = start_stop_ind[1]\n",
    "    y = raw[0,start:stop][0]\n",
    "    y = np.reshape(y,-1)\n",
    "    if i % 300 == 0:\n",
    "       print(\"CWT nr :\", i)\n",
    "    cwt_atr, cwt_freqs =  pywt.cwt(y, np.arange(1,129), WAVELETNAME)\n",
    "    atributes.append(cwt_atr)\n",
    "    frequencies.append(cwt_freqs)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T14:24:06.628944554Z",
     "start_time": "2023-05-31T13:14:55.883360106Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "2. CWT of 1 edf file calclulated in about 8 minutes and weighing over 15 GB."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "np.save('tempname2', [1,2,3])"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "filename = \"tempname\"\n",
    "with open(filename, 'wb') as f:\n",
    "\n",
    "    np.save(f, atributes)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T14:24:06.629272239Z",
     "start_time": "2023-05-31T13:24:48.111928413Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'sizeof' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[0;31mNameError\u001B[0m                                 Traceback (most recent call last)",
      "Cell \u001B[0;32mIn[15], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[43msizeof\u001B[49m(frequencies)\n",
      "\u001B[0;31mNameError\u001B[0m: name 'sizeof' is not defined"
     ]
    }
   ],
   "source": [
    "sizeof(frequencies)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T14:24:06.629741972Z",
     "start_time": "2023-05-31T13:24:48.154950932Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "sizeof(atributes) // sizeof(frequencies)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "start_time": "2023-05-31T13:24:48.566210573Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "atr = np.array(atributes)\n",
    "frequencies = np.array(frequencies)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "atr = [o.shape for o in frequencies]\n",
    "np.all(atr == tuple(128))"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "type(atr[0])"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# here i want to have divided in 20s\n",
    "twenty_sec = edfs[0].crop(0,20)\n",
    "twenty_sec_2 = edfs[0].crop(20,40)\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(twenty_sec[0][0].T)"
   ],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
